En komplett guide till att distribuera Python-paket via PyPI, som tÀcker bÀsta praxis för versionshantering, verktyg och arbetsflöden för globala utvecklare.
Distribution av Python-paket: Publicering pÄ PyPI och versionshantering
Pythons omfattande ekosystem drivs av en enorm samling paket som Àr lÀttillgÀngliga via Python Package Index (PyPI). Denna guide ger en komplett översikt över hur du distribuerar dina egna Python-paket via PyPI för att sÀkerstÀlla att de Àr tillgÀngliga för utvecklare över hela vÀrlden. Vi kommer att utforska de nödvÀndiga verktygen, bÀsta praxis för versionshantering och arbetsflöden för att skapa och publicera högkvalitativa Python-paket.
Varför ska du distribuera ditt Python-paket?
Att distribuera ditt Python-paket erbjuder mÄnga fördelar:
- Dela ditt arbete: LÄter andra utvecklare enkelt ÄteranvÀnda din kod, vilket frÀmjar samarbete och innovation. FörestÀll dig ett globalt team som anvÀnder dina specialiserade dataanalysverktyg byggda i Python.
- Beroendehantering: Förenklar processen för att hantera beroenden i andra projekt. Ditt paket kan installeras med ett enda kommando, tillsammans med alla dess beroenden.
- Bidra till öppen kÀllkod: Ger dig möjlighet att bidra till öppen kÀllkod-gemenskapen och fÄ erkÀnnande för ditt arbete. MÄnga kritiska mjukvarukomponenter Àr paket med öppen kÀllkod som underhÄlls av utvecklare över hela vÀrlden.
- Versionskontroll och uppdateringar: Ger ett strukturerat sÀtt att hantera versioner, slÀppa uppdateringar och ÄtgÀrda buggfixar. Detta sÀkerstÀller att anvÀndare alltid har tillgÄng till den senaste och mest pÄlitliga versionen av ditt paket.
- Enkel installation: Förenklar installationen för anvÀndare genom `pip install ditt-paketnamn`.
NödvÀndiga verktyg för distribution av Python-paket
Flera verktyg Àr nödvÀndiga för att skapa och distribuera Python-paket:
- setuptools: Ett flitigt anvÀnt bibliotek för att definiera paketmetadata, inklusive namn, version, beroenden och ingÄngspunkter. Det Àr de facto-standarden för att paketera Python-projekt.
- wheel: Ett distributionsformat som ger en effektivare och mer tillförlitlig installationsprocess jÀmfört med kÀlldistributioner. Wheels Àr förbyggda distributioner som kan installeras utan att krÀva kompilering.
- twine: Ett verktyg för att sÀkert ladda upp ditt paket till PyPI. Twine krypterar dina inloggningsuppgifter och paketdata under överföringen, vilket skyddar mot avlyssning och man-in-the-middle-attacker.
- venv/virtualenv: Dessa Àr verktyg för att skapa isolerade Python-miljöer. Att anvÀnda virtuella miljöer Àr avgörande för att hantera beroenden och undvika konflikter mellan olika projekt.
Konfigurera ditt projekt
Innan du kan distribuera ditt paket mÄste du strukturera ditt projekt korrekt.
Exempel pÄ projektstruktur
my_package/ âââ my_package/ â âââ __init__.py â âââ module1.py â âââ module2.py âââ tests/ â âââ __init__.py â âââ test_module1.py â âââ test_module2.py âââ README.md âââ LICENSE âââ setup.py âââ .gitignore
Förklaring:
- my_package/: Huvudkatalogen som innehÄller ditt pakets kÀllkod.
- my_package/__init__.py: Gör `my_package`-katalogen till ett Python-paket. Den kan vara tom eller innehÄlla initialiseringskod.
- my_package/module1.py, my_package/module2.py: Dina Python-moduler som innehÄller den faktiska koden.
- tests/: En katalog som innehÄller dina enhetstester. Det Àr avgörande att skriva tester för att sÀkerstÀlla kvaliteten och tillförlitligheten hos ditt paket.
- README.md: En Markdown-fil som ger en beskrivning av ditt paket, anvÀndningsinstruktioner och annan relevant information. Detta Àr ofta det första anvÀndare ser pÄ PyPI.
- LICENSE: En fil som innehÄller licensen under vilken ditt paket distribueras (t.ex. MIT, Apache 2.0, GPL). Att vÀlja en lÀmplig licens Àr avgörande för att specificera hur andra kan anvÀnda din kod.
- setup.py: Huvudkonfigurationsfilen som definierar ditt pakets metadata och bygginstruktioner.
- .gitignore: Specificerar filer och kataloger som ska ignoreras av Git (t.ex. temporÀra filer, byggartefakter).
Skapa `setup.py`-filen
`setup.py`-filen Àr hjÀrtat i din paketdistribution. Den innehÄller metadata om ditt paket och instruktioner för att bygga och installera det. HÀr Àr ett exempel:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="my_package", # ErsÀtt med ditt paketnamn
version="0.1.0",
author="Your Name", # ErsÀtt med ditt namn
author_email="your.email@example.com", # ErsÀtt med din e-post
description="Ett litet exempelpaket",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/yourusername/my_package", # ErsÀtt med URL till ditt repository
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[
"requests", # Exempelberoende
],
)
Förklaring:
- name: Namnet pÄ ditt paket, som kommer att anvÀndas pÄ PyPI. VÀlj ett unikt och beskrivande namn.
- version: Versionsnumret för ditt paket. Följ semantisk versionering (se nedan).
- author, author_email: Ditt namn och din e-postadress.
- description: En kort beskrivning av ditt paket.
- long_description: En lÀngre, mer detaljerad beskrivning, vanligtvis lÀst frÄn din `README.md`-fil.
- long_description_content_type: Specificerar formatet pÄ din lÄnga beskrivning (t.ex. "text/markdown").
- url: URL:en till ditt pakets hemsida (t.ex. GitHub-repository).
- packages: En lista över paket som ska inkluderas i din distribution. `setuptools.find_packages()` upptÀcker automatiskt alla paket i ditt projekt.
- classifiers: Metadata som hjĂ€lper anvĂ€ndare att hitta ditt paket pĂ„ PyPI. VĂ€lj lĂ€mpliga klassificerare frĂ„n listan över Trove Classifiers. ĂvervĂ€g att inkludera klassificerare för Python-versioner som stöds, operativsystem och licenser.
- python_requires: Specificerar den lÀgsta Python-version som krÀvs för att anvÀnda ditt paket.
- install_requires: En lista över beroenden som ditt paket krÀver. Dessa beroenden installeras automatiskt nÀr ditt paket installeras.
Versionshantering: Semantisk versionering
Semantisk versionering (SemVer) Àr ett allmÀnt vedertaget versionsschema som ger ett tydligt och konsekvent sÀtt att kommunicera arten av förÀndringar i ditt paket.
Ett SemVer-versionsnummer bestÄr av tre delar: MAJOR.MINOR.PATCH.
- MAJOR: Ăkas nĂ€r du gör inkompatibla API-Ă€ndringar. Detta indikerar en betydande förĂ€ndring som kan krĂ€va att anvĂ€ndare uppdaterar sin kod.
- MINOR: Ăkas nĂ€r du lĂ€gger till funktionalitet pĂ„ ett bakĂ„tkompatibelt sĂ€tt. Detta signalerar nya funktioner eller förbĂ€ttringar som inte bryter befintlig kod.
- PATCH: Ăkas nĂ€r du gör bakĂ„tkompatibla buggfixar. Detta Ă€r för smĂ„ fixar som inte lĂ€gger till nya funktioner eller bryter befintlig funktionalitet.
Exempel:
- 1.0.0: Första versionen.
- 1.1.0: Lade till en ny funktion utan att bryta befintlig kod.
- 1.0.1: Fixade en bugg i 1.0.0-versionen.
- 2.0.0: Gjorde inkompatibla API-Ă€ndringar.
Att anvÀnda SemVer hjÀlper anvÀndare att förstÄ effekten av att uppgradera till en ny version av ditt paket.
Bygga ditt paket
NĂ€r du har konfigurerat din `setup.py`-fil kan du bygga ditt paket.
- Skapa en virtuell miljö: Det rekommenderas starkt att skapa en virtuell miljö för att isolera ditt pakets beroenden. AnvÀnd `python3 -m venv .venv` (eller `virtualenv .venv`) och aktivera den sedan (`source .venv/bin/activate` pÄ Linux/macOS, `.venv\Scripts\activate` pÄ Windows).
- Installera byggberoenden: Kör `pip install --upgrade setuptools wheel`.
- Bygg paketet: Kör `python setup.py sdist bdist_wheel`. Detta kommando skapar tvÄ distributionsfiler i `dist`-katalogen: en kÀlldistribution (sdist) och en wheel-distribution (bdist_wheel).
`sdist` innehÄller din kÀllkod och `setup.py`-fil. `bdist_wheel` Àr en förbyggd distribution som kan installeras snabbare.
Publicera ditt paket pÄ PyPI
Innan du kan publicera ditt paket mÄste du skapa ett konto pÄ PyPI (https://pypi.org/) och skapa en API-token. Denna token kommer att anvÀndas för att autentisera dina uppladdningar.
- Registrera dig pÄ PyPI: GÄ till https://pypi.org/account/register/ och skapa ett konto.
- Skapa en API-token: GÄ till https://pypi.org/manage/account/, rulla ner till avsnittet "API tokens" och skapa en ny token. Förvara denna token sÀkert, eftersom du kommer att behöva den för att ladda upp ditt paket.
- Installera Twine: Kör `pip install twine`.
- Ladda upp ditt paket: Kör `twine upload dist/*`. Du kommer att bli ombedd att ange ditt anvÀndarnamn (
__token__) och lösenord (den API-token du skapade).
Viktig sÀkerhetsanmÀrkning: Skicka aldrig in din API-token till ditt repository. Förvara den sÀkert och anvÀnd miljövariabler eller andra sÀkra metoder för att komma Ät den under uppladdningsprocessen.
Testa installationen av ditt paket
Efter att ha publicerat ditt paket Àr det viktigt att testa att det kan installeras korrekt.
- Skapa en ny virtuell miljö: Detta sÀkerstÀller att du testar installationen i en ren miljö.
- Installera ditt paket: Kör `pip install ditt-paketnamn`.
- Importera och anvÀnd ditt paket: I en Python-tolk, importera ditt paket och verifiera att det fungerar som förvÀntat.
Kontinuerlig integration och kontinuerlig leverans (CI/CD)
För att automatisera processen med att bygga, testa och publicera ditt paket kan du anvÀnda CI/CD-verktyg som GitHub Actions, GitLab CI eller Travis CI.
HÀr Àr ett exempel pÄ ett GitHub Actions-arbetsflöde som bygger och publicerar ditt paket pÄ PyPI:
name: Publicera pÄ PyPI
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Konfigurera Python 3.x
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Installera beroenden
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Bygg paket
run: python setup.py sdist bdist_wheel
- name: Publicera paket pÄ PyPI
run: |
twine upload dist/* \
-u __token__ \
-p ${{ secrets.PYPI_API_TOKEN }}
Förklaring:
- Detta arbetsflöde utlöses nÀr en ny release publiceras pÄ GitHub.
- Det checkar ut koden, konfigurerar Python, installerar beroenden, bygger paketet och laddar upp det till PyPI.
secrets.PYPI_API_TOKENÀr en GitHub-hemlighet som lagrar din PyPI API-token. Du mÄste konfigurera denna hemlighet i instÀllningarna för ditt GitHub-repository.
BÀsta praxis för distribution av Python-paket
- Skriv omfattande dokumentation: Inkludera en detaljerad `README.md`-fil, samt API-dokumentation med verktyg som Sphinx. Tydlig och komplett dokumentation Àr avgörande för att göra ditt paket lÀtt att anvÀnda.
- Skriv enhetstester: Testa din kod noggrant för att sÀkerstÀlla dess kvalitet och tillförlitlighet. AnvÀnd ett testramverk som pytest eller unittest.
- Följ stilguiden PEP 8: Följ stilguiden i Python Enhancement Proposal 8 (PEP 8) för att sÀkerstÀlla konsekvent och lÀsbar kod.
- AnvÀnd en licens: VÀlj en lÀmplig öppen kÀllkod-licens för att specificera hur andra kan anvÀnda din kod.
- HÄll dina beroenden uppdaterade: Uppdatera regelbundet ditt pakets beroenden för att dra nytta av buggfixar, sÀkerhetsuppdateringar och nya funktioner.
- AnvÀnd en virtuell miljö: Utveckla och testa alltid ditt paket i en virtuell miljö för att isolera beroenden.
- ĂvervĂ€g internationalisering (i18n) och lokalisering (l10n): Om ditt paket hanterar text eller data som visas för anvĂ€ndaren, övervĂ€g att göra det anpassningsbart för olika sprĂ„k och regioner. Detta utökar din potentiella anvĂ€ndarbas globalt. Verktyg som Babel kan hjĂ€lpa till med detta.
- Hantera olika tidszoner och valutor: Om ditt paket hanterar datum, tider eller finansiella transaktioner, var medveten om olika tidszoner och valutor runt om i vÀrlden. AnvÀnd lÀmpliga bibliotek och API:er för att hantera dessa komplexiteter korrekt.
- Ge tydliga felmeddelanden: Skriv informativa felmeddelanden som hjĂ€lper anvĂ€ndare att förstĂ„ vad som gick fel och hur man Ă„tgĂ€rdar det. ĂversĂ€tt dessa felmeddelanden till olika sprĂ„k om möjligt.
- TÀnk pÄ tillgÀnglighet: Ta hÀnsyn till anvÀndare med funktionsnedsÀttningar nÀr du utformar ditt pakets grÀnssnitt och dokumentation. Följ riktlinjer för tillgÀnglighet för att sÀkerstÀlla att ditt paket kan anvÀndas av alla.
Avancerade Àmnen
- Namnrymdspaket (Namespace packages): LÄter dig dela upp ett enda Python-paket över flera kataloger eller till och med flera distributioner.
- IngÄngspunkter (Entry points): LÄter dig definiera funktioner eller klasser som kan anropas frÄn andra paket eller frÄn kommandoraden.
- Datafiler: LÄter dig inkludera filer som inte Àr Python-filer (t.ex. datafiler, konfigurationsfiler) i din distribution.
- Villkorliga beroenden: LÄter dig specificera beroenden som endast krÀvs under vissa förhÄllanden (t.ex. pÄ ett specifikt operativsystem).
Sammanfattning
Att distribuera ditt Python-paket pÄ PyPI Àr ett utmÀrkt sÀtt att dela ditt arbete med vÀrlden och bidra till Pythons ekosystem. Genom att följa stegen och de bÀsta metoderna som beskrivs i den hÀr guiden kan du skapa och publicera högkvalitativa Python-paket som Àr lÀtta att installera, anvÀnda och underhÄlla. Kom ihÄg att prioritera tydlig dokumentation, noggranna tester och konsekvent versionshantering för att sÀkerstÀlla framgÄngen för ditt paket.